package com.hwg.shiliupro.controller;

import com.hwg.shiliupro.annotation.Authority;
import com.hwg.shiliupro.finals.Code;
import com.hwg.shiliupro.po.Note;
import com.hwg.shiliupro.po.R;
import com.hwg.shiliupro.service.NoteService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/api/notes")
public class NoteController {

    @Autowired
    private NoteService noteService;

    /**
     * 查找笔记集合通过用户id  查自己
     *
     * @param id id
     * @return {@link R}
     */
    @GetMapping("/{id}")
    @Authority("note:selectByUserId")
    public R selectByUserId(@PathVariable Integer id){
        log.info("接收到将要查询笔记集合的用户id是：{}",id);
        List<Note> noteList = noteService.selectByUserId(id);
        if(noteList == null){
            return R.error().code(Code.GET_ERR).message("该用户暂时没有笔记");
        }
        return R.ok().code(Code.GET_OK).data(noteList);
    }

    /**
     * 查找笔记集合通过用户id   查别人
     *
     * @param id id
     * @return {@link R}
     */
    @GetMapping("/visible/{id}")
    @Authority("note:selectByUserIdAndVisible")
    public R selectByUserIdAndVisible(@PathVariable Integer id){
        List<Note> noteList = noteService.selectByUserIdAndVisible(id);
        if(noteList == null){
            return R.error().code(Code.GET_ERR).message("该用户暂时没有笔记开放");
        }
        return R.ok().code(Code.GET_OK).data(noteList);
    }


    /**
     * 通过笔记id查询笔记内容 查自己
     *
     * @param id id
     * @return {@link R}
     */
    @GetMapping("/byNoteId/{id}")
    @Authority("note:selectByNoteId")
    public R selectByNoteId(@PathVariable Integer id){
        Note note = noteService.selectByNoteId(id);
        if(note == null){
            return R.error().code(Code.GET_ERR).message("查看失败,请稍后重试~");
        }
        return R.ok().code(Code.GET_OK).data(note);
    }

    /**
     * 通过笔记id查询笔记内容  查别人
     *
     * @param id id
     * @return {@link R}
     */
    @GetMapping("/byNoteId/visible/{id}")
    @Authority("note:selectByNoteIdAndVisible")
    public R selectByNoteIdAndVisible(@PathVariable Integer id){
        Note note = noteService.selectByNoteIdAndVisible(id);
        if(note == null){
            return R.error().code(Code.GET_ERR).message("该笔记未开放~");
        }
        return R.ok().code(Code.GET_OK).data(note);
    }

    /**
     * 按笔记id删除笔记
     *
     * @param id id
     * @return {@link R}
     */
    @DeleteMapping("/{id}")
    @Authority("note:deleteByNoteId")
    public R deleteByNoteId(@PathVariable Integer id){
        if(!noteService.deleteById(id)){
            return R.error().code(Code.DELETE_ERR).message("删除失败,请稍后再试");
        }
        return R.ok().code(Code.DELETE_OK);
    }

    /**
     * 新增笔记
     *
     * @param note 请注意
     * @return {@link R}
     */
    @PostMapping
    @Authority("note:insert")
    public R insertNote(@RequestBody Note note){
        //新增不需要 id
        //反而给他返回  新增之后 note的id  让前端得以修改sessionStorage的值
        int id = noteService.insert(note);
        return R.ok().code(Code.SAVE_OK).data(id);
    }

    /**
     * 修改笔记
     *
     * @param note 请注意
     * @return {@link R}
     */
    @PutMapping
    @Authority("note:updateByNote")
    public R updateNote(@RequestBody Note note){
        if(noteService.updateNote(note)){
           return R.ok().code(Code.UPDATE_OK);
        }
        return R.error().code(Code.UPDATE_ERR).message("修改笔记失败~ 请稍后再试");
    }

}
